package py.una.pol.ii.is2.dao.taller;


/**
 *
 * @author mbenitez
 * @date 30/04/2009
 */

import java.math.BigInteger;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import py.una.pol.ii.is2.domain.taller.DetalleOrdenMantenimientoPlantilla;
import py.una.pol.ii.is2.domain.taller.OrdenMantenimiento;

@Stateless(mappedName="detalleOrdenPlantillaDao")
public class DetalleOrdenMantenimientoPlantillaDAOBean implements DetalleOrdenMantenimientoPlantillaDAOLocal,DetalleOrdenMantenimientoPlantillaDAORemote {
     /**
     * Manejador de instancias de entidades para recuperar instancias desde
     * el Persistence Context
     */
    @PersistenceContext
    private EntityManager em;
    @EJB
    private OrdenMantenimientoDAOLocal ordenDao;
    /**
     * Inserta una entidad de DetalleOrdenMantenimientoPlantilla en la base de datos. 
     *
     * @param objeto Elemento a insertar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean insert(DetalleOrdenMantenimientoPlantilla objeto) throws Exception {
        boolean retorno = false;
        try {
            em.persist(objeto);
            calcularMontos(objeto.getDeopCodOrden());
            retorno = true;
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * Actualiza una entidad de DetalleOrdenMantenimientoPlantilla, recibida como parámetro,
     * en la base de datos. 
     *
     * @param objeto Elemento a editar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean update(DetalleOrdenMantenimientoPlantilla objeto) throws Exception {
        boolean retorno = false;
        try {
            em.merge(objeto);
            calcularMontos(objeto.getDeopCodOrden());
            retorno = true;
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * Elimina una entidad de DetalleOrdenMantenimientoPlantilla, recibida como parámetro,
     * en la base de datos. 
     *
     * @param objeto Elemento a eliminar
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean delete(DetalleOrdenMantenimientoPlantilla objeto) throws Exception {
        boolean retorno = false;
        try {
            DetalleOrdenMantenimientoPlantilla mgdObjeto = em.merge(objeto);
            OrdenMantenimiento orden = mgdObjeto.getDeopCodOrden();
            em.remove(mgdObjeto);
            calcularMontos(orden);
            retorno = true;
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * Este metodo itera sobre la coleccion de plantillas que posee asignadas
     * la orden de mantenimiento y realiza la sumatoria para generar el total.
     *
     * @param orden
     * @return
     * @throws java.lang.Exception
     */
    private boolean calcularMontos(OrdenMantenimiento orden) throws Exception {
        boolean retorno = false;
        BigInteger monto = BigInteger.ZERO;
        
        try {
            for (DetalleOrdenMantenimientoPlantilla detallePlantilla : orden.getDetalleOrdenMantenimientoPlantillaCollection()) {
                monto = monto.add(detallePlantilla.getDeopCostoInsumos().add(detallePlantilla.getDeopCostoManoObra()));
            }
            orden.setOrmaCostoTotal(monto);
            retorno = ordenDao.update(orden);
        } catch (Exception e) {
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Busca un registro de la tabla DetalleOrdenMantenimientoPlantilla por el codigo de la misma.
     * Utiliza el NamedQuery <b>DetalleOrdenMantenimientoPlantilla.findByDeopCod</b> para su efecto.
     *
     * @param codObjeto
     * @return
     * @throws java.lang.Exception
     */
    public DetalleOrdenMantenimientoPlantilla find(Integer codObjeto) throws Exception {
        DetalleOrdenMantenimientoPlantilla retorno = null;
        try {
            Query q = em.createNamedQuery("DetalleOrdenMantenimientoPlantilla.findByDeopCod");
            q.setParameter("deopCod", codObjeto);
            retorno = (DetalleOrdenMantenimientoPlantilla)q.getSingleResult();
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * Devuelve todas las DetalleOrdenMantenimientoPlantillas en caso de que el parametro condicion
     * sea o bien <b>null</b> o <b>vacio</b>, y aquellas que coincidan con la condicion
     * comenzando con la palabra clave <b>where</b>.
     * Las entidades son devueltas ordenadas por la clave primaria.
     *
     *
     * @param condicion Restricción para la selección de resultados
     * @return retorno Lista de resultados arrojados por la ejecución de la consulta, en otro caso null.
     * @throws java.lang.Exception
     */
    public List<DetalleOrdenMantenimientoPlantilla> getListaDetalleOrdenMantenimientoPlantillas(String condicion) throws Exception {
        List<DetalleOrdenMantenimientoPlantilla> retorno = null;
        Query q = null;
        try {
            if(condicion == null || condicion.length() == 0)
                q = em.createNamedQuery("DetalleOrdenMantenimientoPlantilla.findAll");
            else
                q = em.createQuery("select deop from DetalleOrdenMantenimientoPlantilla deop " + condicion + " order by deop.deopCod");
            // recuperamos la lista
            retorno = q.getResultList();
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }

    /**
     * 
     * @param codOrden
     * @return
     * @throws java.lang.Exception
     */
    public List<DetalleOrdenMantenimientoPlantilla> getListaDetalleOrdenMantenimientoPlantillasByCodOrden(OrdenMantenimiento codOrden) throws Exception {
        List<DetalleOrdenMantenimientoPlantilla> retorno = null;
        Query q = null;
        try {
            if(codOrden != null){
                q = em.createQuery("select deop from DetalleOrdenMantenimientoPlantilla deop where deop.deopCodOrden = :codOrden");
                q.setParameter("codOrden", codOrden);
                // recuperamos la lista
                retorno = q.getResultList();
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            return retorno;
        }
    }
 
}
